<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>[mysql] mysql开发规范 - Never Give Up</title>
  <meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />

<meta name="theme-color" content="#f8f5ec" />
<meta name="msapplication-navbutton-color" content="#f8f5ec">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#f8f5ec">


<meta name="author" content="ZhangKQ" /><meta name="description" content="(一)建表规约 1. 【强制】表达是与否概念的字段，必须使用 is_xxx 的方式命名，数据类型是 unsigned tinyint ，此规则同样适用于 odps 建表。 说明：任何字段如果为非负数，必须" /><meta name="keywords" content="数据库, mysql, 规范" />






<meta name="generator" content="Hugo 0.92.0 with theme even" />


<link rel="canonical" href="https://blog.nevergiveup.tech/post/db/mysql/mysql%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">



<link href="/sass/main.min.b5a744db6de49a86cadafb3b70f555ab443f83c307a483402259e94726b045ff.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.css" integrity="sha256-7TyXnr2YU040zfSP+rEcz29ggW4j56/ujTPwjMzyqFY=" crossorigin="anonymous">


<meta property="og:title" content="[mysql] mysql开发规范" />
<meta property="og:description" content="(一)建表规约 1. 【强制】表达是与否概念的字段，必须使用 is_xxx 的方式命名，数据类型是 unsigned tinyint ，此规则同样适用于 odps 建表。 说明：任何字段如果为非负数，必须" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://blog.nevergiveup.tech/post/db/mysql/mysql%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/" /><meta property="article:section" content="post" />
<meta property="article:published_time" content="2018-06-16T15:37:56+08:00" />
<meta property="article:modified_time" content="2022-02-10T16:37:56+08:00" />

<meta itemprop="name" content="[mysql] mysql开发规范">
<meta itemprop="description" content="(一)建表规约 1. 【强制】表达是与否概念的字段，必须使用 is_xxx 的方式命名，数据类型是 unsigned tinyint ，此规则同样适用于 odps 建表。 说明：任何字段如果为非负数，必须"><meta itemprop="datePublished" content="2018-06-16T15:37:56+08:00" />
<meta itemprop="dateModified" content="2022-02-10T16:37:56+08:00" />
<meta itemprop="wordCount" content="3464">
<meta itemprop="keywords" content="数据库,mysql,规范," /><meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="[mysql] mysql开发规范"/>
<meta name="twitter:description" content="(一)建表规约 1. 【强制】表达是与否概念的字段，必须使用 is_xxx 的方式命名，数据类型是 unsigned tinyint ，此规则同样适用于 odps 建表。 说明：任何字段如果为非负数，必须"/>

<!--[if lte IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
<![endif]-->

<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->

</head>
<body>
  <div id="mobile-navbar" class="mobile-navbar">
  <div class="mobile-header-logo">
    <a href="/" class="logo">Never Give Up</a>
  </div>
  <div class="mobile-navbar-icon">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>
<nav id="mobile-menu" class="mobile-menu slideout-menu">
  <ul class="mobile-menu-list">
    <a href="/">
        <li class="mobile-menu-item">主页</li>
      </a><a href="/post/">
        <li class="mobile-menu-item">归档</li>
      </a><a href="/tags/">
        <li class="mobile-menu-item">标签</li>
      </a><a href="/categories/">
        <li class="mobile-menu-item">分类</li>
      </a><a href="/remark/">
        <li class="mobile-menu-item">随言碎语</li>
      </a><a href="/about/">
        <li class="mobile-menu-item">关于</li>
      </a>
  </ul>

  


</nav>

  <div class="container" id="mobile-panel">
    <header id="header" class="header">
        <div class="logo-wrapper">
  <a href="/" class="logo">Never Give Up</a>
</div>





<nav class="site-navbar">
  <ul id="menu" class="menu">
    <li class="menu-item">
        <a class="menu-item-link" href="/">主页</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/post/">归档</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/tags/">标签</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/categories/">分类</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/remark/">随言碎语</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/about/">关于</a>
      </li>
  </ul>
</nav>

    </header>

    <main id="main" class="main">
      <div class="content-wrapper">
        <div id="content" class="content">
          <article class="post">
    
    <header class="post-header">
      <h1 class="post-title">[mysql] mysql开发规范</h1>

      <div class="post-meta">
        <span class="post-time"> 2018-06-16 </span>
        <div class="post-category">
            <a href="/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"> 数据库 </a>
            </div>
          <span class="more-meta"> 约 3464 字 </span>
          <span class="more-meta"> 预计阅读 7 分钟 </span>
        
      </div>
    </header>

    <div class="post-toc" id="post-toc">
  <h2 class="post-toc-title">文章目录</h2>
  <div class="post-toc-content always-active">
    <nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li>
          <ul>
            <li><a href="#一建表规约">(<strong><strong>一</strong></strong>)<strong>建表规约</strong></a></li>
            <li><a href="#二索引规约">(<strong><strong>二</strong></strong>)<strong>索引规约</strong></a></li>
            <li><a href="#三sql-规约">(<strong><strong>三</strong></strong>)SQL <strong>规约</strong></a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</nav>
  </div>
</div>
    <div class="post-content">
      <h3 id="一建表规约">(<strong><strong>一</strong></strong>)<strong>建表规约</strong></h3>
<h4 id="1-强制表达是与否概念的字段必须使用-is_xxx-的方式命名数据类型是-unsigned-tinyint-此规则同样适用于-odps-建表">1. 【强制】表达是与否概念的字段，必须使用 is_xxx 的方式命名，数据类型是 unsigned tinyint ，此规则同样适用于 odps 建表。</h4>
<p>说明：任何字段如果为非负数，必须是 unsigned。</p>
<h4 id="2-强制表名字段名必须使用小写字母或数字禁止出现数字开头禁止两个下划线中间只出现数字数据库字段名的修改代价很大因为无法进行预发布所以字段名称需要慎重考虑">2. 【强制】表名、字段名必须使用小写字母或数字；禁止出现数字开头，禁止两个下划线中间只出现数字。数据库字段名的修改代价很大，因为无法进行预发布，所以字段名称需要慎重考虑。</h4>
<p>正例：getter_admin，task_config，level3_name</p>
<p>反例：GetterAdmin，taskConfig，level_3_name</p>
<h4 id="3-强制表名不使用复数名词">3. 【强制】表名不使用复数名词。</h4>
<p>说明：表名应该仅仅表示表里面的实体内容，不应该表示实体数量，对应于 DO 类名也是单数形式，符合表达习惯。</p>
<h4 id="4-强制禁用保留字如-descrangematchdelayed-等请参考-mysql-官方保留字">4. 【强制】禁用保留字，如 desc、range、match、delayed 等，请参考 MySQL 官方保留字。</h4>
<h4 id="5-强制唯一索引名为-uk_字段名普通索引名则为-idx_字段名">5. 【强制】唯一索引名为 uk_字段名；普通索引名则为 idx_字段名。</h4>
<p>说明：uk_ 即 unique key；idx_ 即 index 的简称。</p>
<h4 id="6-强制小数类型为-decimal禁止使用-float-和-double">6. 【强制】小数类型为 decimal，禁止使用 float 和 double。</h4>
<p>说明：float 和 double 在存储的时候，存在精度损失的问题，很可能在值的比较时，得到不正确的结果。如果存储的数据范围超过 decimal 的范围，建议将数据拆成整数和小数分开存储。</p>
<h4 id="7-强制如果存储的字符串长度几乎相等使用-char-定长字符串类型">7. 【强制】如果存储的字符串长度几乎相等，使用 char 定长字符串类型。</h4>
<h4 id="8-强制varchar-是可变长字符串不预先分配存储空间长度不要超过-5000如果存储长度大于此值定义字段类型为-text独立出来一张表用主键来对应避免影响其它字段索引效率">8. 【强制】varchar 是可变长字符串，不预先分配存储空间，长度不要超过 5000，如果存储长度大于此值，定义字段类型为 text，独立出来一张表，用主键来对应，避免影响其它字段索引效率。</h4>
<h4 id="9-强制表必备两字段created_at-updated_at">9. 【强制】表必备两字段：created_at, updated_at。</h4>
<p>说明：created_at, updated_at 的类型均为 date_time 类型。</p>
<h4 id="10-推荐表的命名最好是加上业务名称_表的作用">10. 【推荐】表的命名最好是加上“业务名称_表的作用”。</h4>
<p>正例：tiger_task / tiger_reader / mpp_config</p>
<h4 id="11-推荐库名与应用名称尽量一致">11. 【推荐】库名与应用名称尽量一致。</h4>
<h4 id="12-推荐如果修改字段含义或对字段表示的状态追加时需要及时更新字段注释">12. 【推荐】如果修改字段含义或对字段表示的状态追加时，需要及时更新字段注释。</h4>
<h4 id="13-推荐字段允许适当冗余以提高性能但是必须考虑数据同步的情况冗余字段应遵循">13. 【推荐】字段允许适当冗余，以提高性能，但是必须考虑数据同步的情况。冗余字段应遵循：</h4>
<p>1）不是频繁修改的字段。</p>
<p>2）不是 varchar 超长字段，更不能是 text 字段。</p>
<p>正例：商品类目名称使用频率高，字段长度短，名称基本一成不变，可在相关联的表中冗余存储类目名称，避免关联查询。</p>
<h4 id="14-推荐单表行数超过-500-万行或者单表容量超过-2gb才推荐进行分库分表">14. 【推荐】单表行数超过 500 万行或者单表容量超过 2GB，才推荐进行分库分表。</h4>
<p>说明：如果预计三年后的数据量根本达不到这个级别，请不要在创建表时就分库分表。</p>
<h4 id="15-参考合适的字符存储长度不但节约数据库表空间节约索引存储更重要的是提升检索速度">15. 【参考】合适的字符存储长度，不但节约数据库表空间、节约索引存储，更重要的是提升检索速度。</h4>
<p>正例：人的年龄用 unsigned tinyint（表示范围 0-255，人的寿命不会超过 255 岁）；海龟就必须是 smallint，但如果是太阳的年龄，就必须是 int；如果是所有恒星的年龄都加起来，那么就必须使用 bigint。</p>
<h3 id="二索引规约">(<strong><strong>二</strong></strong>)<strong>索引规约</strong></h3>
<h4 id="1-强制业务上具有唯一特性的字段即使是组合字段也必须建成唯一索引">1. 【强制】业务上具有唯一特性的字段，即使是组合字段，也必须建成唯一索引。</h4>
<p>说明：不要以为唯一索引影响了 insert 速度，这个速度损耗可以忽略，但提高查找速度是明显的；另外，即使在应用层做了非常完善的校验和控制，只要没有唯一索引，根据墨菲定律，必然有脏数据产生。</p>
<h4 id="2-强制-超过三个表禁止-join需要-join-的字段数据类型保持绝对一致多表关联查询时保证被关联的字段需要有索引">2. 【强制】 超过三个表禁止 join。需要 join 的字段，数据类型保持绝对一致；多表关联查询时，保证被关联的字段需要有索引。</h4>
<p>说明：即使双表 join 也要注意表索引、SQL 性能。</p>
<h4 id="3-强制在-varchar-字段上建立索引时必须指定索引长度没必要对全字段建立索引根据实际文本区分度决定索引长度">3. 【强制】在 varchar 字段上建立索引时，必须指定索引长度，没必要对全字段建立索引，根据实际文本区分度决定索引长度。</h4>
<p>说明：索引的长度与区分度是一对矛盾体，一般对字符串类型数据，长度为 20 的索引，区分度会高达 90%以上，可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。</p>
<h4 id="4-强制页面搜索严禁左模糊或者全模糊如果需要请走搜索引擎来解决">4. 【强制】页面搜索严禁左模糊或者全模糊，如果需要请走搜索引擎来解决。</h4>
<p>说明：索引文件具有 B-Tree 的最左前缀匹配特性，如果左边的值未确定，那么无法使用此索引。</p>
<h4 id="5-推荐如果有-order-by-的场景请注意利用索引的有序性order-by-最后的字段是组合索引的一部分并且放在索引组合顺序的最后避免出现-file_sort-的情况影响查询性能">5. 【推荐】如果有 order by 的场景，请注意利用索引的有序性。order by 最后的字段是组合索引的一部分，并且放在索引组合顺序的最后，避免出现 file_sort 的情况，影响查询性能。</h4>
<p>正例：where a=? and b=? order by c; 索引：a_b_c</p>
<p>反例：索引中有范围查找，那么索引有序性无法利用，如：WHERE a&gt;10 ORDER BY b; 索引a_b 无法排序。</p>
<h4 id="6-推荐利用覆盖索引来进行查询操作来避免回表操作">6. 【推荐】利用覆盖索引来进行查询操作，来避免回表操作。</h4>
<p>说明：如果一本书需要知道第 11 章是什么标题，会翻开第 11 章对应的那一页吗？目录浏览一下就好，这个目录就是起到覆盖索引的作用。</p>
<p>正例：能够建立索引的种类：主键索引、唯一索引、普通索引，而覆盖索引是一种查询的一种效果，用 explain 的结果，extra 列会出现：using index。</p>
<h4 id="7-推荐利用延迟关联或者子查询优化超多分页场景">7. 【推荐】利用延迟关联或者子查询优化超多分页场景。</h4>
<p>说明：MySQL 并不是跳过 offset 行，而是取 offset+N 行，然后返回放弃前 offset 行，返回 N 行，那当 offset 特别大的时候，效率就非常的低下，要么控制返回的总页数，要么对超过特定阈值的页数进行 SQL 改写。</p>
<p>正例：先快速定位需要获取的 id 段，然后再关联：</p>
<p>SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id</p>
<h4 id="8-推荐sql-性能优化的目标至少要达到-range-级别要求是-ref-级别如果可以是-consts最好">8. 【推荐】SQL 性能优化的目标：至少要达到 range 级别，要求是 ref 级别，如果可以是 consts最好。</h4>
<p>说明：</p>
<p>1）consts 单表中最多只有一个匹配行（主键或者唯一索引），在优化阶段即可读取到数据。</p>
<p>2）ref 指的是使用普通的索引（normal index）。</p>
<p>3）range 对索引进行范围检索。</p>
<p>反例：explain 表的结果，type=index，索引物理文件全扫描，速度非常慢，这个 index 级别比较 range 还低，与全表扫描是小巫见大巫。</p>
<h4 id="9-推荐建组合索引的时候区分度最高的在最左边">9. 【推荐】建组合索引的时候，区分度最高的在最左边。</h4>
<p>正例：如果 where a=? and b=? ，a 列的几乎接近于唯一值，那么只需要单建 idx_a 索引即可。</p>
<p>说明：存在非等号和等号混合判断条件时，在建索引时，请把等号条件的列前置。如：where a&gt;? and b=? 那么即使 a 的区分度更高，也必须把 b 放在索引的最前列。</p>
<h4 id="10-参考创建索引时避免有如下极端误解">10. 【参考】创建索引时避免有如下极端误解：</h4>
<p>1）误认为一个查询就需要建一个索引。</p>
<p>2）误认为索引会消耗空间、严重拖慢更新和新增速度。</p>
<p>3）误认为唯一索引一律需要在应用层通过“先查后插”方式解决。</p>
<h3 id="三sql-规约">(<strong><strong>三</strong></strong>)SQL <strong>规约</strong></h3>
<h4 id="1-强制不要使用-count列名或-count常量来替代-countcount就是-sql92-定义-的标准统计行数的语法跟数据库无关跟-null-和非-null-无关">1. 【强制】不要使用 count(列名)或 count(常量)来替代 count(<em>)，count(</em>)就是 SQL92 定义 的标准统计行数的语法，跟数据库无关，跟 NULL 和非 NULL 无关。</h4>
<p>说明：count(*)会统计值为 NULL 的行，而 count(列名)不会统计此列为 NULL 值的行。</p>
<h4 id="2-强制countdistinct-col-计算该列除-null-之外的不重复数量注意-countdistinct-col1-col2-如果其中一列全为-null那么即使另一列有不同的值也返回为-0">2. 【强制】count(distinct col) 计算该列除 NULL 之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为 NULL，那么即使另一列有不同的值，也返回为 0。</h4>
<h4 id="3-强制当某一列的值全是-null-时countcol的返回结果为-0但-sumcol的返回结果为-null因此使用-sum时需注意-npe-问题">3. 【强制】当某一列的值全是 NULL 时，count(col)的返回结果为 0，但 sum(col)的返回结果为 NULL，因此使用 sum()时需注意 NPE 问题。</h4>
<p>正例：可以使用如下方式来避免 sum 的 NPE 问题：SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;</p>
<h4 id="4-强制使用-isnull来判断是否为-null-值注意null-与任何值的直接比较都为-null">4. 【强制】使用 ISNULL()来判断是否为 NULL 值。注意：NULL 与任何值的直接比较都为 NULL。</h4>
<p>说明：</p>
<p>1） NULL&lt;&gt;NULL 的返回结果是 NULL，而不是 false。</p>
<p>2） NULL=NULL 的返回结果是 NULL，而不是 true。</p>
<p>3） NULL&lt;&gt;1 的返回结果是 NULL，而不是 true。</p>
<h4 id="5-强制在代码中写分页查询逻辑时若-count-为-0-应直接返回避免执行后面的分页语句">5. 【强制】在代码中写分页查询逻辑时，若 count 为 0 应直接返回，避免执行后面的分页语句。</h4>
<h4 id="6-强制不得使用外键与级联一切外键概念必须在应用层解决">6. 【强制】不得使用外键与级联，一切外键概念必须在应用层解决。</h4>
<p>说明：（概念解释）学生表中的 student_id 是主键，那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id，同时触发成绩表中的 student_id 更新，则为级联更新。外键与级联更新适用于单机低并发，不适合分布式、高并发集群；级联更新是强阻塞，存在数据库更新风暴的风险；外键影响数据库的插入速度。</p>
<h4 id="7-强制禁止使用存储过程存储过程难以调试和扩展更没有移植性">7. 【强制】禁止使用存储过程，存储过程难以调试和扩展，更没有移植性。</h4>
<h4 id="8-强制数据订正时删除和修改记录时要先-select避免出现误删除确认无误才能执行更新语句">8. 【强制】数据订正时，删除和修改记录时，要先 select，避免出现误删除，确认无误才能执行更新语句。</h4>
<h4 id="9-推荐in-操作能避免则避免若实在避免不了需要仔细评估-in-后边的集合元素数量控制在-1000-个之内">9. 【推荐】in 操作能避免则避免，若实在避免不了，需要仔细评估 in 后边的集合元素数量，控制在 1000 个之内。</h4>
<h4 id="10-参考如果有全球化需要所有的字符存储与表示均以-utf-8-编码那么字符计数方法注意">10. 【参考】如果有全球化需要，所有的字符存储与表示，均以 utf-8 编码，那么字符计数方法注意：</h4>
<p>说明：</p>
<p>SELECT LENGTH(&ldquo;轻松工作&rdquo;)； 返回为 12</p>
<p>SELECT CHARACTER_LENGTH(&ldquo;轻松工作&rdquo;)； 返回为 4</p>
<p>如果要使用表情，那么使用 utfmb4 来进行存储，注意它与 utf-8 编码的区别。</p>
<h4 id="11-参考truncate-table-比-delete-速度快且使用的系统和事务日志资源少但-truncate无事务且不触发-trigger有可能造成事故故不建议在开发代码中使用此语句">11. 【参考】TRUNCATE TABLE 比 DELETE 速度快，且使用的系统和事务日志资源少，但 TRUNCATE无事务且不触发 trigger，有可能造成事故，故不建议在开发代码中使用此语句。</h4>
<p>说明：TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。</p>

    </div>

    <div class="post-copyright">
  <p class="copyright-item">
    <span class="item-title">文章作者</span>
    <span class="item-content">ZhangKQ</span>
  </p>
  <p class="copyright-item">
    <span class="item-title">上次更新</span>
    <span class="item-content">
        2022-02-10
        
    </span>
  </p>
  
  
</div>
<div class="post-reward">
  <input type="checkbox" name="reward" id="reward" hidden />
  <label class="reward-button" for="reward">赞赏支持</label>
  <div class="qr-code">
    
    <label class="qr-code-image" for="reward">
        <img class="image" src="/qrcode/wechat-qr-code.jpg">
        <span>微信打赏</span>
      </label>
    <label class="qr-code-image" for="reward">
        <img class="image" src="/qrcode/alipay-qr-code.jpg">
        <span>支付宝打赏</span>
      </label>
  </div>
</div><footer class="post-footer">
      <div class="post-tags">
          <a href="/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/">数据库</a>
          <a href="/tags/mysql/">mysql</a>
          <a href="/tags/%E8%A7%84%E8%8C%83/">规范</a>
          </div>
      <nav class="post-nav">
        <a class="prev" href="/post/db/mysql/mysql%E9%94%81%E6%9C%BA%E5%88%B6/">
            <i class="iconfont icon-left"></i>
            <span class="prev-text nav-default">[mysql] mysql锁介绍</span>
            <span class="prev-text nav-mobile">上一篇</span>
          </a>
        <a class="next" href="/post/linux/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">
            <span class="next-text nav-default">[linux]linux常用命令</span>
            <span class="next-text nav-mobile">下一篇</span>
            <i class="iconfont icon-right"></i>
          </a>
      </nav>
    </footer>
  </article>
        </div>
        

  

  

      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="social-links">
      <a href="mailto:wdyxzkq@163.com" class="iconfont icon-email" title="email"></a>
      <a href="https://github.com/dysoso" class="iconfont icon-github" title="github"></a>
      <a href="https://gitee.com/dysoso" class="iconfont icon-gitlab" title="gitlab"></a>
  <a href="https://blog.nevergiveup.tech/index.xml" type="application/rss+xml" class="iconfont icon-rss" title="rss"></a>
</div>

<div class="copyright">
  <span class="power-by">
    由 <a class="hexo-link" href="https://blog.nevergiveup.tech/">blog.nevergiveup.tech</a> 强力驱动
  </span>
  <span class="division">|</span>
  <span class="theme-info">
    主题 - 
    <a class="theme-link" href="https://github.com/olOwOlo/hugo-theme-even">Even</a>
  </span>

  

  <span class="copyright-year">
    &copy; 
    2021 - 
    2022<span class="heart"><i class="iconfont icon-heart"></i></span><span><a href="https://beian.miit.gov.cn/">蜀ICP备2021005948号-1</a></span>
  </span>
</div>

    </footer>

    <div class="back-to-top" id="back-to-top">
      <i class="iconfont icon-up"></i>
    </div>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/slideout@1.0.1/dist/slideout.min.js" integrity="sha256-t+zJ/g8/KXIJMjSVQdnibt4dlaDxc9zXr/9oNPeWqdg=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.js" integrity="sha256-XVLffZaxoWfGUEbdzuLi7pwaUJv1cecsQJQqGLe7axY=" crossorigin="anonymous"></script>



<script type="text/javascript" src="/js/main.min.c99b103c33d1539acf3025e1913697534542c4a5aa5af0ccc20475ed2863603b.js"></script>


<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
	ga('create', 'never-give-up', 'auto');
	ga('set', 'anonymizeIp', true);
	ga('send', 'pageview');
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>







</body>
</html>
